
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Dubbo相关面试题 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Dubbo相关面试题 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Dubbo架构中，如果注册中心Zookeeper宕机，已有的消费者还能调用生产者吗？为什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以。因为消费者在启动时会去Zookeeper拉取生产者的地址列表并缓存在本地。当Zookeeper宕机后，消费者仍然可以利用本地缓存的地址列表，通过负载均衡策略发起调用。</div>
          </div>
          <div class="card-source">来源: 1，当zookeeper挂了之后，生产者和消费者之间还能通信吗？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Zookeeper宕机后，虽然已有的服务可以继续通信，但这会带来什么负面影响？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">如果Zookeeper挂掉，后续新启动的生产者将无法注册自己的地址，因此也无法被任何消费者发现和调用，这会导致服务无法进行动态扩容。</div>
          </div>
          <div class="card-source">来源: 1，当zookeeper挂了之后，生产者和消费者之间还能通信吗？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Dubbo架构中，如果监控中心(Monitor)宕机，会影响生产者和消费者之间的通信吗？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">不会。监控中心主要负责收集统计数据，它的宕机只会影响数据的采集过程，并不会中断生产者和消费者之间的正常通信。</div>
          </div>
          <div class="card-source">来源: 2，当监控中心monitor挂了之后，生产者和消费者之间还能通信吗？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Zookeeper是如何存储Dubbo服务信息的？请描述服务提供者和消费者的注册流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Zookeeper采用树状结构存储信息。服务提供者启动时，会向 `/dubbo/服务名/providers` 目录下写入自己的URL地址；服务消费者启动时，则订阅该providers目录以获取地址，并向 `/dubbo/服务名/consumers` 目录下写入自己的URL。</div>
          </div>
          <div class="card-source">来源: 3，zookeeper实际是如何存储生产者和消费者信息？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">Dubbo的轮询（RoundRobin）负载均衡策略存在什么潜在问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">它存在“慢的提供者累积请求”的问题。如果集群中某台机器处理速度很慢但没有宕机，轮询策略会持续将请求分配给它，导致请求被卡住，久而久之，大量请求都可能积压在这台慢机器上。</div>
          </div>
          <div class="card-source">来源: 谈谈Dubbo的负载均衡策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">Dubbo的“最少活跃调用数”（LeastActive）负载均衡策略是如何避免慢提供者问题的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该策略会选择活跃数（指调用前后计数差）最小的提供者。处理速度越慢的提供者，其活跃数就会越大，因此收到的新请求就会越少，从而实现了对慢提供者的流量控制，使请求能被更高效的节点处理。</div>
          </div>
          <div class="card-source">来源: 谈谈Dubbo的负载均衡策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">Dubbo的一致性哈希（ConsistentHash）负载均衡策略有什么特点和适用场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">它的主要特点是能将相同参数的请求总是分发到同一个服务提供者。这种策略适用于需要利用服务端本地缓存以提高缓存命中率的场景。</div>
          </div>
          <div class="card-source">来源: 谈谈Dubbo的负载均衡策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">相较于让服务消费者直接连接提供者，使用注册中心（如Zookeeper）在Dubbo架构中主要带来了什么好处？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">使用注册中心的主要好处是实现了服务提供者和消费者之间的解耦。消费者无需硬编码提供者地址，而是通过注册中心动态发现服务列表，并可以结合负载均衡策略进行调用，从而增强了系统的灵活性和可伸缩性。</div>
          </div>
          <div class="card-source">来源: 5，谈谈采用注册中心和直连的区别？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Dubbo底层的通信原理是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Dubbo底层通信默认采用高性能的Netty框架。Netty是一个基于NIO（非阻塞IO）的通信框架，它利用了NIO的多路复用机制，并在此基础上增加了主从线程池等优化，以实现高效的网络通信。</div>
          </div>
          <div class="card-source">来源: 6，谈谈Dubbo底层的通信原理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
